package de.baumann.browser.api.net;

import java.util.List;

import de.baumann.browser.api.net.base.BaseUrl;
import de.baumann.browser.api.net.vo.AccountInfo;
import de.baumann.browser.api.net.vo.InviteInfo;
import de.baumann.browser.api.net.vo.LoginInfo;
import de.baumann.browser.api.net.vo.OdinAndHashValue;
import de.baumann.browser.api.net.vo.OdinValue;
import de.baumann.browser.api.net.vo.Order;
import de.baumann.browser.api.net.vo.QiNiuToken;
import de.baumann.browser.api.net.vo.Result;
import de.baumann.browser.api.net.vo.SuperiorInfo;
import de.baumann.browser.api.net.vo.WithdrawProgress;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

/**
 * @author:
 * @date:2019/1/7 10:47
 * @discription: 用户相关的接口
 */
@BaseUrl(ApiKey.USER_MODULE)
public interface UserApiService {

    /**
     * 注册
     *
     * @param phone      手机号
     * @param phoneCode  验证码
     * @param password   密码
     * @param inviteCode 邀请码
     * @return Result
     */
    @FormUrlEncoded
    @POST(ApiKey.REGISTER)
    Observable<Result> register(@Field("login_name") String phone,
                                @Field("phone_code") String phoneCode,
                                @Field("countryCode") int countryCode,
                                @Field("password") String password,
                                @Field("invite_code") String inviteCode);

    /**
     * 登录
     *
     * @param username 用户名
     * @param password 密码
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.SIGNIN)
    Observable<Result<LoginInfo>> login(@Field("address") String username);

    /**
     * 登录
     *
     * @param address     钱包地址
     * @param invite_code 邀请码
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.INVITE)
    Observable<Result<String>> inviteCode(@Field("address") String address,
                                          @Field("invite_code") String invite_code);

    /**
     * 注销
     *
     * @param userId 用户ID
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.LOGOUT)
    Observable<Result> logout(@Field("user_id") Integer userId);


    /**
     * 重置密码
     *
     * @param phoneCode 验证码
     * @param phone     手机号
     * @param password  密码
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.RESET_PASS)
    Observable<Result> resetPassword(
            @Field("code") String phoneCode,
            @Field("countryCode") int countryCode,
            @Field("phone") String phone,
            @Field("password") String password);

    /**
     * 绑定手机号 获取 验证密码
     *
     * @param phone    手机号
     * @param password 密码
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.GET_BIND_PHONE_SMS_CODE)
    Observable<Result> bindPhoneGetSmsCode(
            @Field("phone") String phone,
            @Field("countryCode") int countryCode,
            @Field("password") String password);

    /**
     * 绑定手机号码
     *
     * @param phone 手机号
     * @param code  短信验证码
     * @param type  类型  1 绑定 2 更换
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.BIND_PHONE)
    Observable<Result> bindPhone(
            @Field("phone") String phone,
            @Field("code") String code,
            @Field("countryCode") int countryCode,
            @Field("type") int type);


    /**
     * 获取ODIN 收益记录
     *
     * @param pageNum
     * @param pageSize
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.GET_ODIN_RECORD)
    Observable<Result<List<OdinValue>>> getOdinRecord(@Field("page_num") int pageNum,
                                                      @Field("page_size") int pageSize);

    @POST(ApiKey.GET_ODIN_HASH_VALUE)
    Observable<Result<OdinAndHashValue>> getOdinAndHashValue();


    /**
     * 修改用户信息
     *
     * @param content
     * @param type    1 昵称 2 头像 3 QQ  4  ETH地址
     * @return
     */
    @FormUrlEncoded
    @POST(ApiKey.UPDATE_INFO)
    Observable<Result> editUserInfo(
            @Field("content") String content,
            @Field("type") int type);

    /**
     * 获取用户钱包信息
     *
     * @return
     */
    @POST(ApiKey.GET_ACCOUNT_INFO)
    Observable<Result<AccountInfo>> getOdinData();


    @POST(ApiKey.GET_RECHARGE_RECORD)
    Observable<Result<List<Order>>> rechargeRecord();

    @FormUrlEncoded
    @POST(ApiKey.GET_RECHARGE_INFO)
    Observable<Result<Order>> getRechargeDetail(@Field("orderId") String orderId);

    @POST(ApiKey.GET_QINIU_TOKEN)
    Observable<Result<QiNiuToken>> getQiNiuToken();


    @POST(ApiKey.GET_SPREAD_INFOS)
    Observable<Result<InviteInfo>> getSpreadInfos();


    @POST(ApiKey.REQUEST_LICENCE)
    Observable<Result<SuperiorInfo>> inviteAndPoolInfo();

}
